package question4;


public class VisiteurCalcul extends Visiteur<Integer>{
	private Contexte ctxt;

	public VisiteurCalcul(Contexte ctxt){
		this.setContexte(ctxt);
	}

	public Integer visite(Constante c){
		return c.valeur();
	}
	public Integer visite(Variable v){
		return ctxt.lire(v.nom());
	}

	public Integer visite(Addition a){
		return a.getExpression1().accepter(this) + a.getExpression2().accepter(this);
	}
	public Integer visite(Multiplication m){
		return m.getExpression1().accepter(this) * m.getExpression2().accepter(this);
	}
	public Integer visite(Division d){
		return d.getExpression1().accepter(this) / d.getExpression2().accepter(this);
	}
	public Integer visite(Soustraction s){
		return s.getExpression1().accepter(this) - s.getExpression2().accepter(this);
	}

	public Integer visite(Plus p){
		return +p.getExpression().accepter(this);
	}
	public Integer visite(Moins m){
		return -m.getExpression().accepter(this);
	}
	public Integer visite(Factoriel f){
		return Factoriel.fact(f.getExpression().accepter(this));
	}

	public Contexte getContexte() {
		return ctxt;
	}

	public void setContexte(Contexte ctxt) {
		this.ctxt = ctxt;
	}
}
